﻿using System;
using System.Collections;
using System.Data;
using System.Data.Common;
using System.Data.SqlClient;
using System.Text;
using Microsoft.Practices.EnterpriseLibrary.Data;

[assembly: CLSCompliant(true)]
namespace MiEmpresa.DataAccess
{
    /// <summary>
    /// Clase para controlar accesos a la BD
    /// </summary>
    [CLSCompliant(true)]
    public class AccesoBaseDatos
    {
        #region Variables

        ArrayList listaParametros = new ArrayList();

        #endregion

        #region Metodos

        /// <summary>
        /// Metodo para validar el loguin del sitio.
        /// </summary>
        /// <param name="sUsuario">Usuario.</param>
        /// <param name="sPassword">Password.</param>
        /// <returns>Id Usuario</returns>
        public Guid LogOn(string sUsuario, string sPassword)
        {
            Database db = DatabaseFactory.CreateDatabase();
            Guid idRespuesta = Guid.Empty;

            string sProcedimientoAlmacenado = "spAdmonLogin";

            DbCommand LogOnCMD = db.GetStoredProcCommand(sProcedimientoAlmacenado);

            AgregarParametros(db, LogOnCMD, DbType.String, "@fcLoginUser", sUsuario);
            AgregarParametros(db, LogOnCMD, DbType.String, "@fcPassword", sPassword);

            try
            {
                idRespuesta = new Guid(db.ExecuteScalar(LogOnCMD).ToString());
            }
            catch (SqlException ex)
            {
                ManejoErrores.ErroresLog(ex.Message, "LogOn", "DataAccessLayer", "cAccesoBaseDatos", sProcedimientoAlmacenado + " " + ArmaParametros());
            }
            finally
            {
                if (LogOnCMD.Connection.State != ConnectionState.Closed)
                {
                    LogOnCMD.Connection.Close();
                    LogOnCMD.Dispose();
                }
            }

            return idRespuesta;
        }

        /// <summary>
        /// Obtiene el menu general.
        /// </summary>
        /// <param name="idUsuario">El id del usuario.</param>
        /// <returns>Dataset del menu general</returns>
        public DataSet GetMenuGeneral(Guid idUsuario)
        {
            Database db = DatabaseFactory.CreateDatabase();
            DataSet dsRespuesta = new DataSet();

            string sProcedimientoAlmacenado = "spAdmonGetMenu";

            DbCommand GetMenuGeneralCMD = db.GetStoredProcCommand(sProcedimientoAlmacenado);

            AgregarParametros(db, GetMenuGeneralCMD, DbType.Guid, "@idUser", idUsuario);

            try
            {
                dsRespuesta = db.ExecuteDataSet(GetMenuGeneralCMD);
            }
            catch (SqlException ex)
            {
                ManejoErrores.ErroresLog(ex.Message, "GetMenuGeneral", "DataAccessLayer", "cAccesoBaseDatos", sProcedimientoAlmacenado + " " + ArmaParametros());
            }
            finally
            {
                if (GetMenuGeneralCMD.Connection.State != ConnectionState.Closed)
                {
                    GetMenuGeneralCMD.Connection.Close();
                    GetMenuGeneralCMD.Dispose();
                }
            }
            return dsRespuesta;
        }

        /// <summary>
        /// Agrega los parametros a un arreglo para procesarlos en caso de errores.
        /// </summary>
        /// <param name="db">La Base de datos.</param>
        /// <param name="LoginSiteCMD">El comando en uso.</param>
        /// <param name="tipo">El tipo de variable.</param>
        /// <param name="sNombreParametro">Nombre del parametro.</param>
        /// <param name="sValor">Valor.</param>
        private void AgregarParametros(Database db, DbCommand cmd,DbType tipo, string sNombreParametro, object oValor)
        {
            db.AddInParameter(cmd, sNombreParametro, tipo, oValor);
            listaParametros.Add(sNombreParametro + "='" + oValor.ToString() + "'");
        }

        /// <summary>
        /// Arma una cadena de parametros en base a lo que guardamos en el arreglo.
        /// </summary>
        /// <returns>Cadena de parametros</returns>
        private string ArmaParametros()
        {
            StringBuilder sbParametros = new StringBuilder();

            for (int i = 0; i < listaParametros.Count; i++)
            {
                if (i == listaParametros.Count - 1)
                {
                    sbParametros.Append(listaParametros[i]);
                }
                else
                {
                    sbParametros.Append(listaParametros[i] + ", ");
                }
            }

            return sbParametros.ToString();
        }

        #endregion
    }
}